﻿using Kingdee.BOS;
using Kingdee.BOS.Core.DynamicForm;
using Kingdee.BOS.Core.List;
using Kingdee.BOS.Core.List.PlugIn;
using Kingdee.BOS.Core.List.PlugIn.Args;
using Kingdee.BOS.Core.Metadata.ConvertElement;
using Kingdee.BOS.Util;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace RK.ListBillPlugin.Test
{
    [Description("Test:第三方下推"), HotUpdate]
    public class DzPush : AbstractListPlugIn
    {
        private const string vFormId = "PUR_PurchaseOrder";
        /// <summary>
        /// JDA单据的FormId
        /// </summary>
        private const string JDAFormId = "PRD_PPBOM";
        /// <summary>
        /// JDB单据的FormId
        /// </summary>
        private const string JDBFormId = "PRD_PickMtrl";
        public override void OnShowConvertOpForm(ShowConvertOpFormEventArgs e)
        {
            base.OnShowConvertOpForm(e);
            var formId = e.SelectedRows.Select(s => s.FormID).FirstOrDefault();
            if (formId != null && formId == vFormId)
            {
                if (e.ConvertOperation == FormOperationEnum.Push)//下推
                {
                    DoPush(e);
                }
                if (e.ConvertOperation == FormOperationEnum.TrackDown)
                {// 下查
                 // 采购订单 (表面上的源单) -> JDA (真实源单) -> JDB (真实目标单)
                    DoTrackDown(e);
                }
            }
            if (formId != null && formId == JDBFormId)
            {
                //DoTrackUp(e);
            }
        }

        private void DoPush(ShowConvertOpFormEventArgs e)
        {
            // 把真实目标单(JDB)，添加到可选下游单据列表
            ConvertBillElement JDBInfo = new ConvertBillElement();
            JDBInfo.FormID = JDBFormId;
            JDBInfo.Name = new LocaleValue("生产超耗申请单");
            e.BillList.Add(JDBInfo);
            // 标记目标单(JDB)为第三方下推，其真实源单为JDA
            // 下推操作，ReplaceRelation构造参数说明：
            // ReplaceRelation(真实源单FormId, 真实目标单FormId);
            ReplaceRelation JDAToJDB = new ReplaceRelation(JDAFormId, JDBFormId);
            e.ReplaceRelations.Add(JDAToJDB);
        }

        private void DoTrackDown(ShowConvertOpFormEventArgs e)
        {
            // 把真实目标单(JDB)，添加到可选下游单据列表
            ConvertBillElement JDBInfo = new ConvertBillElement();
            JDBInfo.FormID = JDBFormId;
            JDBInfo.Name = new LocaleValue("生产超耗申请单");
            e.BillList.Add(JDBInfo);
            // 标记目标单(JDB)为第三方下推，其真实源单为JDA
            // 下推、选单操作，ReplaceRelation构造参数说明：ReplaceRelation(真实源单FormId, 真实目标单FormId);
            // 上查操作，ReplaceRelation构造参数说明：ReplaceRelation(真实源单FormId, 表面上的源单FormId);
            // 下查操作，ReplaceRelation构造参数说明：ReplaceRelation(真实源单FormId, 正式目标单FormId);
            ReplaceRelation JDAToJDB = new ReplaceRelation(JDAFormId, JDBFormId);
            // 当前采购订单分录内码
            JDAToJDB.TargetLinkId = new List<string>();
            var tId = e.SelectedRows.Select(s => s.EntryPrimaryKeyValue).ToList();
            JDAToJDB.TargetLinkId.Add(string.Join(",", tId)); // 100047仅用于演示，实际运行时，需要取e.SelectedRows中的单据体内码
            // 对应的JDA单据体内码，联查时，将以此内码作为源单内码，搜索JDA下推的JDB单据
            JDAToJDB.SourceLinkId = new List<string>();
            JDAToJDB.SourceLinkId.Add("100135"); // 100017仅用于演示，实际运行时，需根据关系自行查找第三方源单的内码
            e.ReplaceRelations.Add(JDAToJDB);
        }

        public override void OnGetConvertRule(GetConvertRuleEventArgs e)
        {
            base.OnGetConvertRule(e);
            if (e.ConvertOperation == FormOperationEnum.Push && e.TargetFormId.EqualsIgnoreCase(JDBFormId))
            {
                var selectIds = e.SelectedRows.Select(s => s.EntryPrimaryKeyValue).ToList();
                //string filterString = $"FMOEntryID in ({string.Join(",", selectIds)})";
                //var ppbomfid = Api.ExecuteBillQuery(this.Context, JDAFormId, "fid", filterString, "fid", 2000);
                //if (ppbomfid == null || ppbomfid.Count == 0)
                //{
                //    return;
                //}
                //List<string> sFidList = new List<string>();
                //List<string> sEidList = new List<string>();
                //foreach (var pbom in ppbomfid)
                //{
                //    sFidList.Add(pbom[0].ToString());
                //    //sEidList.Add(pbom[1].ToString());
                //}
                // 用户选择下推到JDB，采用的是第三方下推，需要把源单内码调整为JDA的内码
                // 根据实际业务关系，由当前选择的采购订单找到关联的JDA单据
                // 演示代码并没有这种关系，略过，直接填写具体的JDA单据内码
                List<ListSelectedRow> JDARows = new List<ListSelectedRow>();
                JDARows.Add(new ListSelectedRow("100135", "", 0, JDAFormId));
                // 把源单内码替换为JDA的内码
                e.SelectedRows = JDARows.ToArray();
            }
        }
    }
}
